import axios from "axios";
import { UserInfoStore } from '@/stores/userInfoStore'
import { TipStore } from '@/stores/tipStore'
import { showMessageDebounced } from '@/utils/tipHandler';


const Instance = axios.create({
    //网络请求的公共配置
    timeout:10000
})

//请求拦截器
Instance.interceptors.request.use(
    config => {
        const user_Store = UserInfoStore(); // 在拦截器内部初始化store
        const token = localStorage.getItem(user_Store.userToken); //1.在本地存储中取出token令牌
        if (token) {
            config.headers[user_Store.userJwtToken] = token; //2.在请求头中传递token
        }
        return config;
    }, err => {
        console.log("请求拦截器发生错误，错误原因为：", err);
        return Promise.reject(err);
    }
);


//响应拦截器
Instance.interceptors.response.use(
    response => {
        const tip_Store = TipStore();
        const user_Store = UserInfoStore(); // 在拦截器内部初始化store（因为pinia的初始化问题）
        // 处理登录失效的情况
        if (response?.data?.code === 401 || response?.data?.msg === 'NOT_LOGIN') {
            tip_Store.warningTip('登录已过期，请重新登录');
            user_Store.clearUserInfo() // 清除本地存储的用户信息和token
            // location.href = '/login';
            // return Promise.reject(new Error('登录已过期'));
        }
        else if(response?.data?.code !== 1){
            if(response?.data?.msg){
                tip_Store.errorTip(response?.data?.msg);
            }else{
                tip_Store.errorTip('返回的数据格式不正确');
            }
        }
        return response;
    }, 
    error => {
        const tip_Store = TipStore();
        const user_Store = UserInfoStore(); // 在拦截器内部初始化store

        // 处理网络错误等情况
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    showMessageDebounced(tip_Store.warningTip, '登录已过期，请重新登录');
                    user_Store.clearUserInfo() // 清除本地存储的用户信息和token
                    // location.href = '/login';
                    break;
                case 403:
                    showMessageDebounced(tip_Store.errorTip, '没有权限访问该资源');
                    break;
                case 404:
                    showMessageDebounced(tip_Store.errorTip, '请求的资源不存在');
                    break;
                case 405:
                    showMessageDebounced(tip_Store.errorTip, '请求的方法不允许');
                    break;
                case 500:
                    showMessageDebounced(tip_Store.errorTip, '服务器错误，请稍后重试');
                    break;
                default:
                    showMessageDebounced(tip_Store.errorTip, '网络错误，请稍后重试');
            }
        } else if (error.request) {
            showMessageDebounced(tip_Store.errorTip, '网络连接失败，请检查网络设置');
        } else {
            showMessageDebounced(tip_Store.errorTip, '请求发送失败');
        }
        return Promise.reject(error);
    }
);



export default Instance; //导出一个axios实例，名为Instance
